package com.hongji.lms5xxcommunicator.grid.core;

/**
 * 网格规格：定义范围、分辨率、行列数，并提供坐标↔索引的映射。
 * 注意：字段为 public final，保持与你现有代码的访问方式兼容（如 spec.rows）。
 */
public class GridSpec {
    public final double x0, x1, y0, y1, dx, dy; // 网格范围和步长
    public final int rows, cols;               // y方向行数，x方向列数

    public GridSpec(double x0, double x1, double y0, double y1, double dx, double dy) {
        if (dx <= 0 || dy <= 0) throw new IllegalArgumentException("dx/dy must be > 0");
        if (x1 <= x0 || y1 <= y0) throw new IllegalArgumentException("x1>x0 && y1>y0 required");
        this.x0 = x0;
        this.x1 = x1;
        this.y0 = y0;
        this.y1 = y1;
        this.dx = dx;
        this.dy = dy;
        this.cols = (int) Math.ceil((x1 - x0) / dx); // 列数
        this.rows = (int) Math.ceil((y1 - y0) / dy); // 行数
    }

    /**
     * 单个格子的面积
     */
    public double cellArea() {
        return dx * dy;
    }

    /**
     * 把 y 坐标映射到行索引（越界返回 -1）
     */
    public int toRow(double y) {
        int r = (int) Math.floor((y - y0) / dy);
        return (r < 0 || r >= rows) ? -1 : r;
    }

    /**
     * 把 x 坐标映射到列索引（越界返回 -1）
     */
    public int toCol(double x) {
        int c = (int) Math.floor((x - x0) / dx);
        return (c < 0 || c >= cols) ? -1 : c;
    }
}
